主题
读取图片PNG字节流 - GetImagePngData
函数简介
获取指定图像的 完整 PNG 文件字节(可直接落盘为 .png)。
返回的 data 由插件单独堆分配,必须调用 FreeImageData 释放;图像句柄仍需 FreeImagePtr 释放。
接口名称
GetImagePngDataDLL调用
int GetImagePngData(long ola, long ptr, long* data, int* size);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| ola | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| ptr | 长整数型 | OLAImage对象的地址。 |
| data | 长整数型指针 | 返回 PNG 字节缓冲指针(独立分配)。 |
| size | 整数型指针 | 返回数据字节长度。 |
示例
以下示例演示 OLAImage → PNG 字节流 → 磁盘文件。
SDK 调用
cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
long pngPtr = 0; int pngSize = 0;
if (ola.GetImagePngData(imgPtr, &pngPtr, &pngSize) == 1) {
std::ofstream("output/export.png", std::ios::binary).write((const char*)pngPtr, pngSize);
ola.FreeImageData(pngPtr);
}
ola.FreeImage(imgPtr);
}csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.LoadImage(@"images\test.bmp");
if (imgPtr != 0)
{
if (ola.GetImagePngData(imgPtr, out long pngPtr, out int pngSize) == 1)
{
byte[] png = new byte[pngSize];
Marshal.Copy((IntPtr)pngPtr, png, 0, pngSize);
File.WriteAllBytes(@"output\export.png", png);
ola.FreeImageData(pngPtr);
}
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
import ctypes
ola = OLAPlugServer()
img_ptr = ola.LoadImage("images/test.bmp")
if img_ptr:
ret, png_ptr, png_size = ola.GetImagePngData(img_ptr)
if ret == 1:
with open("output/export.png", "wb") as f:
f.write((ctypes.c_char * png_size).from_address(png_ptr))
ola.FreeImageData(png_ptr)
ola.FreeImage(img_ptr)java
import com.olaplug.OLAPlugServer;
import com.sun.jna.Pointer;
import java.nio.file.Files;
import java.nio.file.Paths;
OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
var png = ola.GetImagePngData(imgPtr);
if (png != null && png.success) {
byte[] outBytes = new Pointer(png.data.data).getByteArray(0, png.data.size);
Files.write(Paths.get("output/export.png"), outBytes);
ola.FreeImageData(png.data.data);
}
ola.FreeImagePtr(imgPtr);
}go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.LoadImage("images/test.bmp")
if imgPtr != 0 {
pngPtr := 0; int pngSize = 0
if (ola.GetImagePngData(imgPtr, &pngPtr, &pngSize) == 1) {
std::ofstream("output/export.png", std::ios::binary).write((const char*)pngPtr, pngSize)
ola.FreeImageData(pngPtr)
}
ola.FreeImage(imgPtr)
}rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.load_image("images/test.bmp");
if imgPtr != 0 {
let pngPtr = 0; int pngSize = 0;
if (ola.get_image_png_data(imgPtr, &mut pngPtr as *mut i32, &mut pngSize as *mut i32) == 1) {
std::ofstream("output/export.png", std::ios::binary).write((const char*)pngPtr, pngSize)
ola.free_image_data(pngPtr);
}
ola.free_image(imgPtr);
}cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.LoadImage("images/test.bmp")
if(imgPtr) {
var ret = ola.GetImagePngData(imgPtr)
ola.WriteBytesToFile("output/export.png", ret.data, ret.size)
ola.FreeImageData(ret.data)
ola.FreeImage(imgPtr)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.LoadImage("images/test.bmp")
If imgPtr <> 0 Then
ret = ola.GetImagePngData(imgPtr)
ola.WriteBytesToFile "output/export.png", ret(0), ret(1)
ola.FreeImageData ret(0)
ola.FreeImage(imgPtr)
End Iftext
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 pngPtr, 长整数型
.局部变量 pngOut, 字节集
.局部变量 pngSize, 整数型
ola.创建 ()
imgPtr = ola.LoadImage (“images/test.bmp”)
.如果真 (imgPtr ≠ 0)
ret = ola.GetImagePngData (imgPtr, pngPtr, pngSize)
.如果真 (ret = 1)
pngOut = 指针到字节集 (pngPtr, pngSize)
写到文件 (“output/export.png”, pngOut)
ola.FreeImageData (pngPtr)
.如果真结束
ola.FreeImagePtr (imgPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.LoadImage("images/test.bmp");
if(imgPtr){
var ret, pngPtr, pngSize = ola.GetImagePngData(imgPtr);
if(ret == 1){
string(pngPtr, pngSize).save("output/export.png");
ola.FreeImageData(pngPtr);
}
ola.FreeImage(imgPtr);
}text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.LoadImage("images/test.bmp")
如果真 (imgPtr ≠ 0)
{
长整数 pngPtr = 0
整数 pngSize = 0, ret = 0
ret = ola.GetImagePngData(imgPtr, pngPtr, pngSize)
如果真 (ret = 1)
{
变量 pngOut <类型 = 字节集类>
pngOut = 指针到字节集(pngPtr, pngSize)
写到文件("output/export.png", pngOut)
ola.FreeImageData(pngPtr)
}
ola.FreeImagePtr(imgPtr)
}cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
long pngPtr = 0; int pngSize = 0;
if (ola.GetImagePngData(imgPtr, &pngPtr, &pngSize) == 1) {
std::ofstream("output/export.png", std::ios::binary).write((const char*)pngPtr, pngSize);
ola.FreeImageData(pngPtr);
}
ola.FreeImage(imgPtr);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = LoadImage(instance, "images/test.bmp");
if (imgPtr != 0) {
long pngPtr = 0; int pngSize = 0;
GetImagePngData(instance, imgPtr, &pngPtr, &pngSize);
WriteBytesToFile(instance, "output/export.png", pngPtr, pngSize);
FreeImageData(instance, pngPtr);
FreeImagePtr(instance, imgPtr);
}csharp
GetImagePngData(instance, imgPtr, out long pngPtr, out int pngSize);
WriteBytesToFile(instance, @"output\export.png", pngPtr, pngSize);
FreeImageData(instance, pngPtr);
FreeImagePtr(instance, imgPtr);python
data = c_int64(0); size = c_int(0)
ola.GetImagePngData(instance, img_ptr, byref(data), byref(size))
ola.WriteBytesToFile(instance, b"output/export.png", data, size)
ola.FreeImageData(instance, data)
ola.FreeImagePtr(instance, img_ptr)返回值
| 返回值 | 说明 |
|---|---|
1 | 成功。 |
0 | 失败。 |
注意事项
结论:本接口返回的 data 是新分配的 PNG 文件字节,须 FreeImageData(data);来源句柄另调 FreeImagePtr。FreeImagePtr 不会自动释放本缓冲;这与 GetImageData(只需 FreeImagePtr、禁止 FreeImageData)不同。完整对照见 图像处理模块总览 · 所有权对照。
| 项目 | 说明 |
|---|---|
GetImagePngData 返回的 data | 须调用 FreeImageData 释放。 |
来源 OLAImage 句柄 | 须调用 FreeImagePtr / SDK FreeImage 释放。 |
| 与 FreeImagePtr 关系 | FreeImagePtr(imgPtr) 不会自动释放本接口返回的 data。 |
| 输出格式 | 标准 PNG 文件字节,可直接写入 .png。 |
| 与 GetImageData / GetImageBmpData | GetImageData 是句柄内原始像素视图(勿 FreeImageData);GetImageBmpData 同为独立缓冲,释放规则与本接口相同。 |
